Welcome file

Zmiany w wersjach ABAP 7.40 - 7.5x

Wraz z wydaniem ABAP 7.40 język ABAP przeszedł największą ewolucję od lat. Kolejne wersje z linii 7.4x i 7.5x wprowadziły nowoczesny, bardziej deklaratywny styl programowania, zbliżony do współczesnych języków wysokiego poziomu.

Pojawiły się m.in. deklaracje inline, wyrażenia funkcyjne (VALUE, FOR, COND), nowy styl Open SQL oraz liczne usprawnienia poprawiające czytelność, bezpieczeństwo typów i produktywność programisty - przy jednoczesnym zachowaniu pełnej kompatybilności wstecznej.

Celem tego artykułu jest syntetyczne podsumowanie najważniejszych zmian wprowadzonych w wersjach ABAP 7.40-7.5x, ze szczególnym naciskiem na praktyczne różnice w składni, typowe pułapki oraz elementy, które warto znać zarówno w codziennej pracy, jak i podczas rozmów technicznych.

Warto pamiętać!

Złota zasada mówi: nowa składnia = czytelność , stara składnia =
kontrola. Nowa składnia nie zastępuje starej - obydwa style mogą
współistnieć w jednym programie (backward compatibility). Niektóre
wyrażenia mogą mieć inne zachowanie (np. jak obsługa błędów, wartości
domyślne) niż stara składnia - warto testować przy konwersji starego
kodu.

Kiedy używać nowej składni?

Przydatne linki:

  1. ABAP 7.40 Quick Reference - SAP Community
  2. ABAP 7.5x Quick Reference - SAP Community

KRÓTKIE PODSUMOWANIE

ABAP 7.40

ABAP 7.50+

ABAP 7.54+

ABAP 7.57–7.58

Zalety nowej składni:


Główne zmiany w nowej składni ABAP od 7.40

  1. Inline declarations - deklaracje „w locie”:

Stara składnia

DATA: lv_sum TYPE i. lv_sum = 5 + 10.

Nowa składnia

Możesz deklarować zmienne bez wcześniejszego DATA: na górze programu - w samym miejscu użycia - jest krócej:

DATA(result) = 5 + 10.
  1. LOOP AT (pętla po tabeli):

Stara składnia

`DATA: wa TYPE scarr.

LOOP AT it_scarr INTO wa.
  WRITE: wa-carrid.
ENDLOOP.` 

Nowa składnia

LOOP AT it_scarr INTO DATA(wa). WRITE wa-carrid. ENDLOOP.

Albo jeszcze lepiej (field-symbol):

LOOP AT it_scarr ASSIGNING FIELD-SYMBOL(<wa>). WRITE <wa>-carrid. ENDLOOP.

  1. READ TABLE vs. table expressions:

Stara składnia

READ TABLE itab INTO wa WITH KEY id = lv_id. IF sy-subrc = 0. lv_name = wa-name. ENDIF.

Nowa składnia

DATA(lv_name) = itab[ id = lv_id ]-name.

Z kontrolą istnienia:

IF line_exists( itab[ id = lv_id ] ). DATA(lv_name) = itab[ id = lv_id ]-name. ENDIF.

  1. IF / CASE vs. COND / SWITCH

Stara składnia

IF lv_score > 50. lv_result = 'PASS'. ELSE. lv_result = 'FAIL'. ENDIF.

Nowa składnia (COND)

DATA(lv_result) = COND string( WHEN lv_score > 50 THEN 'PASS' ELSE 'FAIL' ).

CASE

CASE lv_status. WHEN 'A'. lv_text = 'Active'. WHEN 'I'. lv_text = 'Inactive'. ENDCASE.

SWITCH

DATA(lv_text) = SWITCH string( lv_status WHEN 'A' THEN 'Active' WHEN 'I' THEN 'Inactive' ELSE 'Unknown' ).

  1. CONCATENATE vs. string templates

Stara składnia

CONCATENATE 'User:' lv_user 'Age:' lv_age INTO lv_text SEPARATED BY space.

Nowa składnia

DATA(lv_text) = |User: { lv_user } Age: { lv_age }|.

  1. SELECT INTO TABLE

Stara składnia

`DATA: it_scarr TYPE TABLE OF scarr.

SELECT * FROM scarr INTO TABLE it_scarr.` 

Nowa składnia

SELECT * FROM scarr INTO TABLE @DATA(it_scarr).

  1. SELECT SINGLE

Stara składnia

SELECT SINGLE carrname INTO lv_name FROM scarr WHERE carrid = lv_id.

Nowa składnia

SELECT SINGLE carrname FROM scarr INTO @DATA(lv_name) WHERE carrid = @lv_id.

  1. Tworzenie tabeli (VALUE + FOR)

Stara składnia

`DATA: itab TYPE TABLE OF i,
      lv_i TYPE i.

DO 5 TIMES.
  lv_i = sy-index.
  APPEND lv_i TO itab.
ENDDO.` 

Nowa składnia

DATA(itab) = VALUE #( FOR i = 1 UNTIL i > 5 ( i ) ).

  1. FILTER zamiast LOOP + IF

Stara składnia

LOOP AT it_employees INTO wa. IF wa-age > 30. APPEND wa TO it_filtered. ENDIF. ENDLOOP.

Nowa składnia

DATA(it_filtered) = FILTER #( it_employees WHERE age > 30 ).

  1. REDUCE (sumy, agregacje)

Stara składnia

lv_sum = 0. LOOP AT it_numbers INTO lv_num. lv_sum = lv_sum + lv_num. ENDLOOP.

Nowa składnia

DATA(lv_sum) = REDUCE i( INIT x = 0 FOR lv_num IN it_numbers NEXT x = x + lv_num ).

Nowa składnia i funkcje ABAP 7.5x (7.50 -> 7.58)

Artykuł „ABAP 7.5x Quick Reference” na SAP Community to praktyczne krótkie podsumowanie najważniejszych nowości i rozszerzeń składni ABAP w wersjach 7.50-7.58 (tzw. 7.5x releases)*. Poniżej przedstawiam krótkie podsumowanie artykułu:

  1. Nowe przypisania i operatory arytmetyczne (7.54)

Od ABAP 7.54 wprowadzono krótsze operatory przypisania:

Stara składnia

`lv_counter = lv_counter + 1.

CONCATENATE lv_text ' more' INTO lv_text.` 

Nowa składnia

lv_counter += 1. lv_text &&= ' more'.

  1. Usprawnione ASSIGN (7.57)

Stara składnia

ASSIGN COMPONENT lv_comp OF STRUCTURE ls_struc TO <fs>. IF sy-subrc <> 0. UNASSIGN <fs>. ENDIF.

Nowa składnia

ASSIGN COMPONENT lv_comp OF STRUCTURE ls_struc TO <fs> ELSE UNASSIGN.

  1. Metody funkcyjne z RETURN expr (7.58)

Zamiast deklarować zmienną pośrednią w metodzie, możesz bezpośrednio zwrócić wynik w jednym wyrażeniu:

RETURN ipow( base = root exp = 2 ).

To ułatwia pisanie metod z krótszym kodem.

Stara składnia

METHOD get_sum. DATA lv_sum TYPE i. lv_sum = iv_a + iv_b. rv_sum = lv_sum. ENDMETHOD.

Nowa składnia

METHOD get_sum. RETURN iv_a + iv_b. ENDMETHOD.

  1. Nowe typy danych (7.50 -> 7.54)

W nowszych wersjach pojawiły się m.in.:

  1. Enumerated Types / Enum’y (7.51)

Możesz definiować typy wyliczeniowe, co pozwala na ograniczenie wartości zmiennej do przyjętej listy:

Stara składnia (stałe)

`CONSTANTS:
  c_open   TYPE i VALUE 1,
  c_closed TYPE i VALUE 2.

DATA lv_status TYPE i.
lv_status = c_open.` 

Nowa składnia (ENUM)

`TYPES BEGIN OF ENUM status.
  open,
  closed
END OF ENUM status.

DATA(lv_status) = status-open.`

Wskazana nowość zapewnia:

  1. Virtual Sort (7.52)

Mechanizm sortowania bez fizycznego sortowania tabeli - otrzymujesz indeks sortujący, który możesz potem wykorzystać do odczytu danych w żądanej kolejności. Przydatne przy wielokrotnych sortowaniach.

Stara składnia (fizyczne sortowanie)

SORT itab BY name age. LOOP AT itab INTO wa. ENDLOOP.

Nowa składnia (sortowanie wirtualne)

`DATA(sort_tab) = cl_abap_itab_utilities=>virtual_sort(
  im_table = itab
  im_sort  = VALUE #( ( name = 'NAME' ascending = abap_true )
                       ( name = 'AGE'  ascending = abap_true ) )
).

LOOP AT sort_tab INTO DATA(idx).
  DATA(wa) = itab[ idx ].
ENDLOOP.` 
  1. Indicators dla struktur (7.55)

Nowy sposób oznaczania, które pola struktury mają zostać uaktualnione w update’ach baz danych.
Możesz określić, które komponenty tabeli bazowej mają zostać zmienione przy operacji UPDATE.

Stara składnia

`ls_db-field1 = lv_val.
ls_db-field2 = lv_val2.

UPDATE ztable FROM ls_db.` 

Nowa składnia

`DATA(ind) = VALUE ztable_ind(
  field1 = abap_true
).

ls_db-field1 = lv_val.

UPDATE ztable FROM ls_db INDICATORS ind.` 
  1. Move-Corresponding - rozszerzone funkcje (7.56)

Mind-blowing opcje:

Stara składnia

MOVE-CORRESPONDING ls_src TO ls_tgt.

Nowa składnia

MOVE-CORRESPONDING ls_src TO ls_tgt EXPANDING NESTED TABLES KEEPING TARGET LINES.

9) LOOP … STEP n (7.57)

Możesz teraz iterować po tabeli z krokiem n zamiast domyślnego 1:

LOOP AT itab ASSIGNING <fs> STEP 2.

Działa też dla pętli FOR, APPEND, DELETE, INSERT, VALUE.

Stara składnia

`DATA lv_idx TYPE i VALUE 1.

WHILE lv_idx <= lines( itab ).
  READ TABLE itab INDEX lv_idx INTO wa.
  lv_idx = lv_idx + 2.
ENDWHILE.` 

Nowa składnia

LOOP AT itab INTO DATA(wa) STEP 2. ENDLOOP.

  1. Expanded CORRESPONDING Operator (7.58)

Rozszerzone mapowanie struktur z użyciem:

Stara składnia

ls_tgt-field1 = ls_src-fieldA. ls_tgt-field2 = 'X'.

Nowa składnia

DATA(ls_tgt) = CORRESPONDING ty_target( ls_src MAPPING field1 = fieldA DEFAULT field2 = 'X' ).

  1. CDS Views i RAP (ciągły rozwój)

Artykuł skrótowo wspomina też (w kontekście 7.5x) rozwój CDS Views, które są kluczowe przy nowoczesnym modelowaniu danych w S/4HANA i RAP - z dodatkowymi funkcjami CDS w kolejnych wersjach ABAP.

PODSUMOWANIE:

ABAP 7.40

ABAP 7.50+

ABAP 7.54+

ABAP 7.57–7.58